package gestionmagasins_aspectj_junit_patterns.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;

import gestionmagasins_aspectj_junit_patterns.forms.CustomJFrame;
import gestionmagasins_aspectj_junit_patterns.forms.LoginJFrame;
import gestionmagasins_aspectj_junit_patterns.model.Securite;

import javax.swing.JFrame;

public aspect AuthenticationAspect 
{

	//Pointcut defini pour l'execution des constructeurs des formulaire qui heritent de la classe CustomJFrame
	//seulement si ces appels ne sont PAS effectue dans AuthenticationAspect
	//et en recuperant l'objet appelant ainsi que le parametre passe au constructeur
	pointcut login(CustomJFrame callerJFrame, JFrame parentJFrame) :   execution(CustomJFrame.new(JFrame))
																	&& !within(AuthenticationAspect) 
																	&& this(callerJFrame) 
																	&& args(parentJFrame);
	
	void around(CustomJFrame callerJFrame, JFrame parentJFrame) : login(callerJFrame, parentJFrame)
	{	
		//S'il n'est pas connecte
		if(Securite.getInstance().getCurrentUsager() == null)
		{
			//Creation et affichage d'une fenetre de connexion
			LoginJFrame loginJFrame = new LoginJFrame(callerJFrame);
			loginJFrame.setVisible(true);
			
			//La fentre de connexion sera la fenetre parent de l'objet CustomJFrame appelant, celle qui sera affiche a sa fermeture
			
			parentJFrame = loginJFrame;
		}
		else//sinon on rend visible la fentre appelante
		{			
			callerJFrame.setVisible(true);
		}
		
		//Poursuite du code car l'aspect est defini pour les 'executions'
		proceed(callerJFrame, parentJFrame);
	}
}
